package jp.sinmetal.trainer.action;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import org.seasar.struts.annotation.Execute;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.http.AccessToken;
import twitter4j.http.RequestToken;

/**
 * TwitterAction
 * @author ishimura
 *
 */
public class TwitterAction {

	@Resource
	protected HttpSession session;

	private final String CONSUMER_KEY = "CONSUMER_KEY";
	private final String CONSUMER_SECRET = "CONSUMER_SECRET";

	/**
	 * OAuth認証エントリーポイント
	 * @author ishimura
	 *
	 * @return
	 * @throws TwitterException
	 */
	@Execute(validator = false)
	public String index() throws TwitterException {
		Twitter twitter = new TwitterFactory().getOAuthAuthorizedInstance(CONSUMER_KEY, CONSUMER_SECRET);
		RequestToken requestToken = twitter.getOAuthRequestToken();
		session.setAttribute("requestToken", requestToken);
		return requestToken.getAuthorizationURL();
	}

	/**
	 * OAuth認証後処理
	 * @author ishimura
	 *
	 * @return
	 */
	@Execute(validator = false)
	public String auth() {
		Twitter twitter = new TwitterFactory().getInstance();
		twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
		RequestToken requestToken = (RequestToken)session.getAttribute("requestToken");
		AccessToken accessToken = null;
		try {
		    accessToken = twitter.getOAuthAccessToken(requestToken);
		} catch (TwitterException e) {
		    throw new RuntimeException(e);
		}

		try {
			User user = twitter.verifyCredentials();
			Integer id = user.getId();	//twitter内でのシリアルキー？

			String name = user.getName();
			String screenName = user.getScreenName();
			String profileImageURL = user.getProfileImageURL().toString();

			saveAccessToken(id, accessToken);
		} catch (TwitterException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}

		return "index.jsp";
	}

	/**
	 * 呟く
	 * @author ishimura
	 *
	 * @param tweet
	 */
	public void tweet(int userId, String tweet) {
		AccessToken accessToken = loadAccessToken(userId);
		Twitter twitter = new TwitterFactory()
			.getOAuthAuthorizedInstance(CONSUMER_KEY, CONSUMER_SECRET, accessToken);
		try {
			twitter.updateStatus(tweet);
		} catch (TwitterException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}

	/**
	 * アクセストークン保存
	 * @author ishimura
	 *
	 * @param userId
	 * @param accessToken
	 */
	private  void saveAccessToken(int userId, AccessToken accessToken){
		//TODO 自分で呟くだけならば、Webからアクセストークンが見れる
	    //accessToken.getToken() を保存
	    //accessToken.getTokenSecret() を保存
	  }

	/**
	 * アクセストークン取得
	 * @author ishimura
	 *
	 * @param userId
	 * @return
	 */
	private AccessToken loadAccessToken(int userId){
	    String token = "hoge";// load from a persistent store
	    String tokenSecret = "hoge";// load from a persistent store
	    return new AccessToken(token, tokenSecret);
	  }

}
